package tech.novastar.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tech.novastar.dao.DaoFactory;
import tech.novastar.dao.StoreImpl;
import tech.novastar.domain.Store;
import java.util.List;

/**
 * 操作库存
 * @author lidl
 */
public class StoreService {
    private static final Logger logger = LoggerFactory.getLogger(StoreService.class);

    private static StoreImpl storeImpl = DaoFactory.getStoreDao();

    /**
     * 新增商品, 如已存在，添加失败；商品数量<0, 添加失败
     * @param name 商品名称
     * @param count 商品数量
     * @return 操作的结果
     */
    public String addStore(String name, int count) {
        boolean isExist = storeImpl.findByNameStrict(name);
        if(! isExist) {
            if(count < 0) {
                logger.error("新增商品失败: {}, 数量：{}", name, count);
                return "添加失败，库存不可小于0";
            }
            Store s = new Store(name, count);
            if(storeImpl.addStore(s)) {
                logger.info("新增商品: {}, 数量：{}", name, count);
                return "增加成功";
            }
        }
        logger.error("新增商品已存在: {}, 数量：{}", name, count);
        return "添加失败，商品已经存在";
    }

    public String deleteById(int id) {
        boolean result = storeImpl.deleteById(id);
        if (result) {
            logger.info("删除商品成功: {}", id);
            return "删除成功";
        } else {
            logger.info("删除商品失败: {}", id);
            return "删除失败";
        }
    }

    /**
     * 更新商品库存数量，如果总数<0, 就提示更新失败
     * @param id 商品Id
     * @param count >0 是增加库存， <0 是减少库存
     * @return
     */
    public String updateById(int id, int count) {
        // preCount 更新库存前的数量
        int preCount = storeImpl.findById(id).getCount();
        if( preCount + count < 0) {
            return "更新商品库存失败, 库存数量不能小于0";
        }
        boolean result = storeImpl.updateById(id, count+preCount);
        if (result) {
            logger.info("更新商品库存成功, Id: {}, count: {} ", id, count);
            return "更新商品库存成功";
        } else {
            logger.info("更新库存成功, Id: {}, count: {}", id, count);
            return "更新商品库存失败";
        }
    }

    public List<Store> fetchAllStore() {
        return storeImpl.fetchAllStore();
    }

    public Store findById(int id) {
        return storeImpl.findById(id);
    }

    public List<Store> findByName(String name) {
        return storeImpl.findByName(name);
    }
}
